/*
 * MyTableCellTransferHandler.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 15/03/2011, 06:00:05 PM
 */
package com.ufps.cuatro.util.dnd;

import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidor;
import java.awt.Cursor;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DragSource;
import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.table.DefaultTableModel;

/**
 * <i><b>MyTableCellTransferHandler:</b></i><p>Esta Clase  se encarga de la
 * administración de los procesos de arrastrar y soltar componentes en la matriz de distribución.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/08
 * @see TransferHandler
 */
public class MyTableCellTransferHandler extends TransferHandler {
    private static final long serialVersionUID = 7395036512596007264L;
    private final DataFlavor localObjectFlavor;
    private String transferedObject = null;  
    private ControlarTablaDistribucion objControladorTabla;
    
    /**
     * Constructor por Defecto que inicializa el Controlador de la Tabla de Distribución.
     * @param objControladorTabla Controlador de la Tabla de Distribución.
     */
    public MyTableCellTransferHandler(ControlarTablaDistribucion objControladorTabla) {        
        this.objControladorTabla = objControladorTabla;
        localObjectFlavor = new ActivationDataFlavor(String.class, DataFlavor.javaJVMLocalObjectMimeType, "String");
    }
    
    @Override 
    protected Transferable createTransferable(JComponent c) {        
       try{
            JTable table = (JTable) c;
            transferedObject = (String) table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
            return new DataHandler(transferedObject,localObjectFlavor.getMimeType());
        }catch(java.lang.Exception ex){}
       return null;
    }
    
    @Override 
    public boolean canImport(TransferSupport info) {
        try{
            JTable t = (JTable)info.getComponent();
            boolean b = info.isDrop()&&info.isDataFlavorSupported(localObjectFlavor);
            //XXX bug?
            t.setCursor(b?DragSource.DefaultMoveDrop:DragSource.DefaultMoveNoDrop);
            return b;
        }catch(java.lang.Exception ex){}
        return false;
    }
    
    @Override 
    public int getSourceActions(JComponent c) {
        return COPY_OR_MOVE;
    }
    
    @Override 
    public boolean importData(TransferSupport info) {
        try{
            JTable target = (JTable)info.getComponent();
            JTable.DropLocation dl  = (JTable.DropLocation)info.getDropLocation();        
            int y = dl.getRow();
            int x = dl.getColumn();
            target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            try{
                String value = (String)info.getTransferable().getTransferData(localObjectFlavor);            
                if(!this.validarInclusion(value)){                
                    return false;
                }
                if(objControladorTabla.ubicarPorDnD(value, x, y)){
                    System.out.println("Componente: " + value + " Ubicado en Celda (" + x + "," + y + ")");
                }
                return true;
            }catch(UnsupportedFlavorException ufe) {
            }catch(java.io.IOException ioe) {
            }
            return false;
        }catch(java.lang.Exception ex){}
        return false;
    }
    
    @Override 
    protected void exportDone(JComponent c, Transferable t, int act) {
        cleanup(c, act == MOVE);
    }
    private void cleanup(JComponent src, boolean remove) {
        if(remove) {
            JTable table = (JTable)src;
            src.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            DefaultTableModel model = (DefaultTableModel)table.getModel();
        }
    }
    
    private boolean validarInclusion(String value){
        //Validar No Inclusion de la Raíz
        ComponenteDistribuidor objComponenteDistribuidor = objControladorTabla.getObjComponenteDistribuidorParent();
        if(objComponenteDistribuidor.getName().equals(value)){
            UtilRender.msgAdvertencia("No puede Ubicar el Contenedor Principal en la Distribución Actual.");
            return false;
        }
        else if(objComponenteDistribuidor.buscarComponente(value) == null){
            UtilRender.msgAdvertencia("No se Puede Incluir el Componente en Distribución Actual.");
            return false;
        }
        return true;
    }
}